package editorsvg.gui.generico;

import javax.swing.JTree;
import javax.swing.tree.TreePath;

/**
 * Buscador de nodos de arboles swing.
 * 
 * @author Jorge Berjano
 */
public class BuscadorNodoArbol {

    private JTree arbol;
    private Comparador comparador;

    public BuscadorNodoArbol(JTree arbol) {
        this.arbol = arbol;
    }
        
    public TreePath buscar(Comparador comparador) {
        this.comparador = comparador;
        
        if (arbol.getModel().getRoot() == null) {
            return null;
        }
        
        return buscarNodo(new TreePath(arbol.getModel().getRoot()));
    }

    public TreePath buscar(Object nodo) {
        comparador = new Comparador.ComparadorObjeto(nodo);
        return buscarNodo(new TreePath(arbol.getModel().getRoot()));
    }

    public TreePath buscarTexto(String texto) {
        comparador = new Comparador.ComparadorContieneTexto(texto);
        return buscarNodo(new TreePath(arbol.getModel().getRoot()));
    }
        
    private TreePath buscarNodo(TreePath camino) {
        
        if (comparador.comparar(camino)) {
            return camino;
        }
        
        Object padre = camino.getLastPathComponent();

        int numeroHijos = arbol.getModel().getChildCount(padre);
        for (int i = 0; i < numeroHijos; i++) {
            Object hijo = arbol.getModel().getChild(padre, i);
            TreePath resultado = buscarNodo(camino.pathByAddingChild(hijo));
            if (resultado != null) {
                return resultado;
            }
        }
        return null;
    }
}
